        <!DOCTYPE html>
        <html>
        <head>
                <meta charset="utf-8">
        <title>ConstantVolumeJoint class / box2d_console Library / Dart Documentation</title>
        <link rel="stylesheet" type="text/css"
            href="../styles.css">
        <link href="http://fonts.googleapis.com/css?family=Open+Sans:400,600,700,800" rel="stylesheet" type="text/css">
        <link rel="shortcut icon" href="../favicon.ico">
        
        </head>
        <body data-library="box2d_console" data-type="ConstantVolumeJoint">
        <div class="page">
        <div class="header">
          <a href="../index.html"><div class="logo"></div></a>
          <a href="../index.html">Dart Documentation</a>
         &rsaquo; <a href="../box2d_console.html">box2d_console</a> &rsaquo; <a href="../box2d_console/ConstantVolumeJoint.html">ConstantVolumeJoint</a>        <div id="search-box">
          <input type="search" name="q" id="q" autocomplete="off"
              class="search-input" placeholder="Search API">
        </div>
        
      </div>
      <div class="drop-down" id="drop-down"></div>
      
        <div class="nav">
        
</div>
<div class="content">
        <h2><strong>ConstantVolumeJoint</strong>
          class
        </h2>
        
<button id="show-inherited" class="show-inherited">Hide inherited</button>
<div class="doc">
<p>This joint is commonly used to simulate a soft body with a constant volume.
A constant volume joint can only be created with three or more bodies. The
area within a grouping of constant volume joints is kept constant, such that
the compression of one part of the area will be offset by the expansion of
other parts.</p>
<pre class="source">
class ConstantVolumeJoint extends Joint {
  List&lt;Body&gt; bodies;
  List&lt;num&gt; targetLengths;
  num targetVolume;

  List&lt;Vector&gt; normals;

  TimeStep step;

  num _impulse;

  World _world;

  List&lt;DistanceJoint&gt; distanceJoints;

  num frequencyHz;
  num dampingRatio;

  ConstantVolumeJoint(this._world, ConstantVolumeJointDef def) :
    super(def),
    _impulse = 0 {
    if (def.bodies.length &lt;= 2) {
      throw new IllegalArgumentException(
          "You cannot create a constant volume joint with less than three "
          "bodies.");
    }

    // Create a fixed size array with a capacity equal to the number of elements
    // in the growable array in the definition.
    bodies = new List.from(def.bodies);

    targetLengths = new List&lt;num&gt;(bodies.length);
    for (int i = 0; i &lt; targetLengths.length; ++i) {
      final int next = (i == targetLengths.length - 1) ? 0 : i + 1;
      Vector temp = new Vector.copy(bodies[i].worldCenter);
      temp.subLocal(bodies[next].worldCenter);
      num dist = temp.length;
      targetLengths[i] = dist;
    }
    targetVolume = area;

    if (def.joints != null &amp;&amp; def.joints.length != def.bodies.length) {
      throw new IllegalArgumentException(
          "Incorrect joint definition.  Joints have to correspond to "
          "the bodies");
    }

    if (def.joints == null) {
      final djd = new DistanceJointDef();
      distanceJoints = new List&lt;DistanceJoint&gt;(bodies.length);
      for (int i = 0; i &lt; targetLengths.length; ++i) {
        final int next = (i == targetLengths.length - 1) ? 0 : i + 1;
        djd.frequencyHz = def.frequencyHz;
        djd.dampingRatio = def.dampingRatio;
        djd.initialize(bodies[i], bodies[next], bodies[i].worldCenter,
            bodies[next].worldCenter);
        distanceJoints[i] = _world.createJoint(djd);
      }
    } else {
      distanceJoints = new List&lt;DistanceJoint&gt;(def.joints.length);
      distanceJoints.setRange(0, def.joints.length, def.joints);
    }

    frequencyHz = def.frequencyHz;
    dampingRatio = def.dampingRatio;

    normals = new List&lt;Vector&gt;(bodies.length);
    for (int i = 0; i &lt; normals.length; ++i) {
      normals[i] = new Vector();
    }

    this.bodyA = bodies[0];
    this.bodyB = bodies[1];
    this.collideConnected = false;
  }

  void inflate(num factor) {
    targetVolume *= factor;
  }

  void destructor() {
    for (int i = 0; i &lt; distanceJoints.length; ++i) {
      _world.destroyJoint(distanceJoints[i]);
    }
  }

  num get area() {
    num result = 0.0;
    result += bodies[bodies.length - 1].worldCenter.x * bodies[0].worldCenter.y
        - bodies[0].worldCenter.x * bodies[bodies.length - 1].worldCenter.y;
    for (int i = 0; i &lt; bodies.length - 1; ++i) {
      result += bodies[i].worldCenter.x * bodies[i + 1].worldCenter.y
          - bodies[i + 1].worldCenter.x * bodies[i].worldCenter.y;
    }
    result *= .5;
    return result;
  }

  /**
   * Apply the position correction to the particles.
   */
  bool constrainEdges(TimeStep argStep) {
    num perimeter = 0.0;
    for (int i = 0; i &lt; bodies.length; ++i) {
      final int next = (i == bodies.length - 1) ? 0 : i + 1;
      num dx = bodies[next].worldCenter.x - bodies[i].worldCenter.x;
      num dy = bodies[next].worldCenter.y - bodies[i].worldCenter.y;
      num dist = Math.sqrt(dx * dx + dy * dy);
      if (dist &lt; Settings.EPSILON) {
        dist = 1.0;
      }
      normals[i].x = dy / dist;
      normals[i].y = -dx / dist;
      perimeter += dist;
    }

    final delta = new Vector();

    num deltaArea = targetVolume - area;
    num toExtrude = 0.5 * deltaArea / perimeter; // relaxationFactor
    bool done = true;
    for (int i = 0; i &lt; bodies.length; ++i) {
      final int next = (i == bodies.length - 1) ? 0 : i + 1;
      delta.setCoords(toExtrude * (normals[i].x + normals[next].x), toExtrude
          * (normals[i].y + normals[next].y));
      num norm = delta.length;
      if (norm &gt; Settings.MAX_LINEAR_CORRECTION) {
        delta.mulLocal(Settings.MAX_LINEAR_CORRECTION / norm);
      }
      if (norm &gt; Settings.LINEAR_SLOP) {
        done = false;
      }
      bodies[next].sweep.center.x += delta.x;
      bodies[next].sweep.center.y += delta.y;
      bodies[next].synchronizeTransform();
    }

    return done;
  }

  void initVelocityConstraints(TimeStep argStep) {
    step = argStep;

    final d = new List&lt;Vector&gt;(bodies.length);
    for (int i = 0; i &lt; bodies.length; i++) {
      d[i] = new Vector();
    }

    for (int i = 0; i &lt; bodies.length; ++i) {
      final int prev = (i == 0) ? bodies.length - 1 : i - 1;
      final int next = (i == bodies.length - 1) ? 0 : i + 1;
      d[i].setFrom(bodies[next].worldCenter);
      d[i].subLocal(bodies[prev].worldCenter);
    }

    if (step.warmStarting) {
      _impulse *= step.dtRatio;
      for (int i = 0; i &lt; bodies.length; ++i) {
        bodies[i].linearVelocity.x += bodies[i].invMass * d[i].y *
            .5 * _impulse;
        bodies[i].linearVelocity.y += bodies[i].invMass * -d[i].x *
            .5 * _impulse;
      }
    } else {
      _impulse = 0.0;
    }
  }

  /**
   * Solves for the impact of this joint on the positions of the connected
   * bodies. Implements abstract method in [Joint].
   */
  bool solvePositionConstraints(num baumgarte) {
    return constrainEdges(step);
  }

  /**
   * Solves for the impact of this joint on the velocities of the connected
   * bodies. Implements abstract method in [Joint].
   */
  void solveVelocityConstraints(TimeStep argStep) {
    num crossMassSum = 0.0;
    num dotMassSum = 0.0;

    final d = new List&lt;Vector&gt;(bodies.length);
    for (int i = 0; i &lt; bodies.length; i++) {
      d[i] = new Vector();
    }

    for (int i = 0; i &lt; bodies.length; ++i) {
      final int prev = (i == 0) ? bodies.length - 1 : i - 1;
      final int next = (i == bodies.length - 1) ? 0 : i + 1;
      d[i].setFrom(bodies[next].worldCenter);
      d[i].subLocal(bodies[prev].worldCenter);
      dotMassSum += (d[i].lengthSquared) / bodies[i].mass;
      crossMassSum += Vector.crossVectors(bodies[i].linearVelocity, d[i]);
    }
    num lambda = -2.0 * crossMassSum / dotMassSum;
    _impulse += lambda;
    for (int i = 0; i &lt; bodies.length; ++i) {
      bodies[i].linearVelocity.x += bodies[i].invMass * d[i].y * .5 * lambda;
      bodies[i].linearVelocity.y += bodies[i].invMass * -d[i].x * .5 * lambda;
    }
  }

  void getAnchorA(Vector argOut) {
    throw new NotImplementedException();
  }

  void getAnchorB(Vector argOut) {
    throw new NotImplementedException();
  }

  void getReactionForce(num inv_dt, Vector argOut) {
    throw new NotImplementedException();
  }

  num getReactionTorque(num inv_dt) {
    throw new NotImplementedException();
  }
}
</pre>
</div>
<h3>Extends</h3>
<p>
<span class="type-box"><span class="icon-class"></span><a href="../box2d_console/Joint.html">Joint</a></span>&nbsp;&gt;&nbsp;<span class="type-box"><span class="icon-class"></span><strong>ConstantVolumeJoint</strong></span></p>
<div>
<h3>Constructors</h3>
<div class="method"><h4 id="ConstantVolumeJoint">
<button class="show-code">Code</button>
new <strong>ConstantVolumeJoint</strong>(<a href="../box2d_console/World.html">World</a> _world, <a href="../box2d_console/ConstantVolumeJointDef.html">ConstantVolumeJointDef</a> def) <a class="anchor-link" href="#ConstantVolumeJoint"
              title="Permalink to ConstantVolumeJoint.ConstantVolumeJoint">#</a></h4>
<div class="doc">
<pre class="source">
ConstantVolumeJoint(this._world, ConstantVolumeJointDef def) :
  super(def),
  _impulse = 0 {
  if (def.bodies.length &lt;= 2) {
    throw new IllegalArgumentException(
        "You cannot create a constant volume joint with less than three "
        "bodies.");
  }

  // Create a fixed size array with a capacity equal to the number of elements
  // in the growable array in the definition.
  bodies = new List.from(def.bodies);

  targetLengths = new List&lt;num&gt;(bodies.length);
  for (int i = 0; i &lt; targetLengths.length; ++i) {
    final int next = (i == targetLengths.length - 1) ? 0 : i + 1;
    Vector temp = new Vector.copy(bodies[i].worldCenter);
    temp.subLocal(bodies[next].worldCenter);
    num dist = temp.length;
    targetLengths[i] = dist;
  }
  targetVolume = area;

  if (def.joints != null &amp;&amp; def.joints.length != def.bodies.length) {
    throw new IllegalArgumentException(
        "Incorrect joint definition.  Joints have to correspond to "
        "the bodies");
  }

  if (def.joints == null) {
    final djd = new DistanceJointDef();
    distanceJoints = new List&lt;DistanceJoint&gt;(bodies.length);
    for (int i = 0; i &lt; targetLengths.length; ++i) {
      final int next = (i == targetLengths.length - 1) ? 0 : i + 1;
      djd.frequencyHz = def.frequencyHz;
      djd.dampingRatio = def.dampingRatio;
      djd.initialize(bodies[i], bodies[next], bodies[i].worldCenter,
          bodies[next].worldCenter);
      distanceJoints[i] = _world.createJoint(djd);
    }
  } else {
    distanceJoints = new List&lt;DistanceJoint&gt;(def.joints.length);
    distanceJoints.setRange(0, def.joints.length, def.joints);
  }

  frequencyHz = def.frequencyHz;
  dampingRatio = def.dampingRatio;

  normals = new List&lt;Vector&gt;(bodies.length);
  for (int i = 0; i &lt; normals.length; ++i) {
    normals[i] = new Vector();
  }

  this.bodyA = bodies[0];
  this.bodyB = bodies[1];
  this.collideConnected = false;
}
</pre>
</div>
</div>
</div>
<div>
<h3>Properties</h3>
<div class="field inherited"><h4 id="active">
<button class="show-code">Code</button>
final bool         <strong>active</strong> <a class="anchor-link"
            href="#active"
            title="Permalink to ConstantVolumeJoint.active">#</a>
        </h4>
        <div class="inherited-from">inherited from <a href="../box2d_console/Joint.html">Joint</a> </div><div class="doc">
<p>Short-cut function to determine if either body is inactive.</p>
<pre class="source">
bool get active() {
  return bodyA.active &amp;&amp; bodyB.active;
}
</pre>
</div>
</div>
<div class="field"><h4 id="area">
<button class="show-code">Code</button>
final num         <strong>area</strong> <a class="anchor-link"
            href="#area"
            title="Permalink to ConstantVolumeJoint.area">#</a>
        </h4>
        <div class="doc">
<pre class="source">
num get area() {
  num result = 0.0;
  result += bodies[bodies.length - 1].worldCenter.x * bodies[0].worldCenter.y
      - bodies[0].worldCenter.x * bodies[bodies.length - 1].worldCenter.y;
  for (int i = 0; i &lt; bodies.length - 1; ++i) {
    result += bodies[i].worldCenter.x * bodies[i + 1].worldCenter.y
        - bodies[i + 1].worldCenter.x * bodies[i].worldCenter.y;
  }
  result *= .5;
  return result;
}
</pre>
</div>
</div>
<div class="field"><h4 id="bodies">
<button class="show-code">Code</button>
List&lt;<a href="../box2d_console/Body.html">Body</a>&gt;         <strong>bodies</strong> <a class="anchor-link"
            href="#bodies"
            title="Permalink to ConstantVolumeJoint.bodies">#</a>
        </h4>
        <div class="doc">
<pre class="source">
List&lt;Body&gt; bodies;
</pre>
</div>
</div>
<div class="field inherited"><h4 id="bodyA">
<button class="show-code">Code</button>
<a href="../box2d_console/Body.html">Body</a>         <strong>bodyA</strong> <a class="anchor-link"
            href="#bodyA"
            title="Permalink to ConstantVolumeJoint.bodyA">#</a>
        </h4>
        <div class="inherited-from">inherited from <a href="../box2d_console/Joint.html">Joint</a> </div><div class="doc">
<pre class="source">
Body bodyA;
</pre>
</div>
</div>
<div class="field inherited"><h4 id="bodyB">
<button class="show-code">Code</button>
<a href="../box2d_console/Body.html">Body</a>         <strong>bodyB</strong> <a class="anchor-link"
            href="#bodyB"
            title="Permalink to ConstantVolumeJoint.bodyB">#</a>
        </h4>
        <div class="inherited-from">inherited from <a href="../box2d_console/Joint.html">Joint</a> </div><div class="doc">
<pre class="source">
Body bodyB;
</pre>
</div>
</div>
<div class="field inherited"><h4 id="collideConnected">
<button class="show-code">Code</button>
bool         <strong>collideConnected</strong> <a class="anchor-link"
            href="#collideConnected"
            title="Permalink to ConstantVolumeJoint.collideConnected">#</a>
        </h4>
        <div class="inherited-from">inherited from <a href="../box2d_console/Joint.html">Joint</a> </div><div class="doc">
<pre class="source">
bool collideConnected;
</pre>
</div>
</div>
<div class="field"><h4 id="dampingRatio">
<button class="show-code">Code</button>
num         <strong>dampingRatio</strong> <a class="anchor-link"
            href="#dampingRatio"
            title="Permalink to ConstantVolumeJoint.dampingRatio">#</a>
        </h4>
        <div class="doc">
<pre class="source">
num dampingRatio;
</pre>
</div>
</div>
<div class="field"><h4 id="distanceJoints">
<button class="show-code">Code</button>
List&lt;<a href="../box2d_console/DistanceJoint.html">DistanceJoint</a>&gt;         <strong>distanceJoints</strong> <a class="anchor-link"
            href="#distanceJoints"
            title="Permalink to ConstantVolumeJoint.distanceJoints">#</a>
        </h4>
        <div class="doc">
<pre class="source">
List&lt;DistanceJoint&gt; distanceJoints;
</pre>
</div>
</div>
<div class="field inherited"><h4 id="edgeA">
<button class="show-code">Code</button>
<a href="../box2d_console/JointEdge.html">JointEdge</a>         <strong>edgeA</strong> <a class="anchor-link"
            href="#edgeA"
            title="Permalink to ConstantVolumeJoint.edgeA">#</a>
        </h4>
        <div class="inherited-from">inherited from <a href="../box2d_console/Joint.html">Joint</a> </div><div class="doc">
<pre class="source">
JointEdge edgeA;
</pre>
</div>
</div>
<div class="field inherited"><h4 id="edgeB">
<button class="show-code">Code</button>
<a href="../box2d_console/JointEdge.html">JointEdge</a>         <strong>edgeB</strong> <a class="anchor-link"
            href="#edgeB"
            title="Permalink to ConstantVolumeJoint.edgeB">#</a>
        </h4>
        <div class="inherited-from">inherited from <a href="../box2d_console/Joint.html">Joint</a> </div><div class="doc">
<pre class="source">
JointEdge edgeB;
</pre>
</div>
</div>
<div class="field"><h4 id="frequencyHz">
<button class="show-code">Code</button>
num         <strong>frequencyHz</strong> <a class="anchor-link"
            href="#frequencyHz"
            title="Permalink to ConstantVolumeJoint.frequencyHz">#</a>
        </h4>
        <div class="doc">
<pre class="source">
num frequencyHz;
</pre>
</div>
</div>
<div class="field inherited"><h4 id="invIA">
<button class="show-code">Code</button>
num         <strong>invIA</strong> <a class="anchor-link"
            href="#invIA"
            title="Permalink to ConstantVolumeJoint.invIA">#</a>
        </h4>
        <div class="inherited-from">inherited from <a href="../box2d_console/Joint.html">Joint</a> </div><div class="doc">
<pre class="source">
num invIA;
</pre>
</div>
</div>
<div class="field inherited"><h4 id="invIB">
<button class="show-code">Code</button>
num         <strong>invIB</strong> <a class="anchor-link"
            href="#invIB"
            title="Permalink to ConstantVolumeJoint.invIB">#</a>
        </h4>
        <div class="inherited-from">inherited from <a href="../box2d_console/Joint.html">Joint</a> </div><div class="doc">
<pre class="source">
num invIB;
</pre>
</div>
</div>
<div class="field inherited"><h4 id="invMassA">
<button class="show-code">Code</button>
num         <strong>invMassA</strong> <a class="anchor-link"
            href="#invMassA"
            title="Permalink to ConstantVolumeJoint.invMassA">#</a>
        </h4>
        <div class="inherited-from">inherited from <a href="../box2d_console/Joint.html">Joint</a> </div><div class="doc">
<pre class="source">
num invMassA;
</pre>
</div>
</div>
<div class="field inherited"><h4 id="invMassB">
<button class="show-code">Code</button>
num         <strong>invMassB</strong> <a class="anchor-link"
            href="#invMassB"
            title="Permalink to ConstantVolumeJoint.invMassB">#</a>
        </h4>
        <div class="inherited-from">inherited from <a href="../box2d_console/Joint.html">Joint</a> </div><div class="doc">
<pre class="source">
num invMassB;
</pre>
</div>
</div>
<div class="field inherited"><h4 id="islandFlag">
<button class="show-code">Code</button>
bool         <strong>islandFlag</strong> <a class="anchor-link"
            href="#islandFlag"
            title="Permalink to ConstantVolumeJoint.islandFlag">#</a>
        </h4>
        <div class="inherited-from">inherited from <a href="../box2d_console/Joint.html">Joint</a> </div><div class="doc">
<pre class="source">
bool islandFlag;
</pre>
</div>
</div>
<div class="field inherited"><h4 id="localCenterA">
<button class="show-code">Code</button>
final <a href="../box2d_console/Vector.html">Vector</a>         <strong>localCenterA</strong> <a class="anchor-link"
            href="#localCenterA"
            title="Permalink to ConstantVolumeJoint.localCenterA">#</a>
        </h4>
        <div class="inherited-from">inherited from <a href="../box2d_console/Joint.html">Joint</a> </div><div class="doc">
<pre class="source">
final Vector localCenterA;
</pre>
</div>
</div>
<div class="field inherited"><h4 id="localCenterB">
<button class="show-code">Code</button>
final <a href="../box2d_console/Vector.html">Vector</a>         <strong>localCenterB</strong> <a class="anchor-link"
            href="#localCenterB"
            title="Permalink to ConstantVolumeJoint.localCenterB">#</a>
        </h4>
        <div class="inherited-from">inherited from <a href="../box2d_console/Joint.html">Joint</a> </div><div class="doc">
<pre class="source">
final Vector localCenterB;
</pre>
</div>
</div>
<div class="field"><h4 id="normals">
<button class="show-code">Code</button>
List&lt;<a href="../box2d_console/Vector.html">Vector</a>&gt;         <strong>normals</strong> <a class="anchor-link"
            href="#normals"
            title="Permalink to ConstantVolumeJoint.normals">#</a>
        </h4>
        <div class="doc">
<pre class="source">
List&lt;Vector&gt; normals;
</pre>
</div>
</div>
<div class="field inherited"><h4 id="runtimeType">
<button class="show-code">Code</button>
final Type         <strong>runtimeType</strong> <a class="anchor-link"
            href="#runtimeType"
            title="Permalink to ConstantVolumeJoint.runtimeType">#</a>
        </h4>
        <div class="inherited-from">inherited from Object </div><div class="doc">
<p>A representation of the runtime type of the object.</p>
<pre class="source">
external Type get runtimeType;
</pre>
</div>
</div>
<div class="field"><h4 id="step">
<button class="show-code">Code</button>
<a href="../box2d_console/TimeStep.html">TimeStep</a>         <strong>step</strong> <a class="anchor-link"
            href="#step"
            title="Permalink to ConstantVolumeJoint.step">#</a>
        </h4>
        <div class="doc">
<pre class="source">
TimeStep step;
</pre>
</div>
</div>
<div class="field"><h4 id="targetLengths">
<button class="show-code">Code</button>
List&lt;num&gt;         <strong>targetLengths</strong> <a class="anchor-link"
            href="#targetLengths"
            title="Permalink to ConstantVolumeJoint.targetLengths">#</a>
        </h4>
        <div class="doc">
<pre class="source">
List&lt;num&gt; targetLengths;
</pre>
</div>
</div>
<div class="field"><h4 id="targetVolume">
<button class="show-code">Code</button>
num         <strong>targetVolume</strong> <a class="anchor-link"
            href="#targetVolume"
            title="Permalink to ConstantVolumeJoint.targetVolume">#</a>
        </h4>
        <div class="doc">
<pre class="source">
num targetVolume;
</pre>
</div>
</div>
<div class="field inherited"><h4 id="type">
<button class="show-code">Code</button>
int         <strong>type</strong> <a class="anchor-link"
            href="#type"
            title="Permalink to ConstantVolumeJoint.type">#</a>
        </h4>
        <div class="inherited-from">inherited from <a href="../box2d_console/Joint.html">Joint</a> </div><div class="doc">
<pre class="source">
int type;
</pre>
</div>
</div>
<div class="field inherited"><h4 id="userData">
<button class="show-code">Code</button>
Object         <strong>userData</strong> <a class="anchor-link"
            href="#userData"
            title="Permalink to ConstantVolumeJoint.userData">#</a>
        </h4>
        <div class="inherited-from">inherited from <a href="../box2d_console/Joint.html">Joint</a> </div><div class="doc">
<pre class="source">
Object userData;
</pre>
</div>
</div>
</div>
<div>
<h3>Operators</h3>
<div class="method inherited"><h4 id="==">
<button class="show-code">Code</button>
bool <strong>operator ==</strong>(other) <a class="anchor-link" href="#=="
              title="Permalink to ConstantVolumeJoint.operator ==">#</a></h4>
<div class="inherited-from">inherited from Object </div><div class="doc">
<p>The equality operator.</p>
<p>The default behavior for all <code>Object</code>s is to return true if and
only if <code>this</code> and 
<span class="param">other</span> are the same object.</p>
<p>If a subclass overrides the equality operator it should override
the <code>hashCode</code> method as well to maintain consistency.</p>
<pre class="source">
bool operator ==(other) =&gt; identical(this, other);
</pre>
</div>
</div>
</div>
<div>
<h3>Methods</h3>
<div class="method"><h4 id="ConstantVolumeJoint">
<button class="show-code">Code</button>
new <strong>ConstantVolumeJoint</strong>(<a href="../box2d_console/World.html">World</a> _world, <a href="../box2d_console/ConstantVolumeJointDef.html">ConstantVolumeJointDef</a> def) <a class="anchor-link" href="#ConstantVolumeJoint"
              title="Permalink to ConstantVolumeJoint.ConstantVolumeJoint">#</a></h4>
<div class="doc">
<pre class="source">
ConstantVolumeJoint(this._world, ConstantVolumeJointDef def) :
  super(def),
  _impulse = 0 {
  if (def.bodies.length &lt;= 2) {
    throw new IllegalArgumentException(
        "You cannot create a constant volume joint with less than three "
        "bodies.");
  }

  // Create a fixed size array with a capacity equal to the number of elements
  // in the growable array in the definition.
  bodies = new List.from(def.bodies);

  targetLengths = new List&lt;num&gt;(bodies.length);
  for (int i = 0; i &lt; targetLengths.length; ++i) {
    final int next = (i == targetLengths.length - 1) ? 0 : i + 1;
    Vector temp = new Vector.copy(bodies[i].worldCenter);
    temp.subLocal(bodies[next].worldCenter);
    num dist = temp.length;
    targetLengths[i] = dist;
  }
  targetVolume = area;

  if (def.joints != null &amp;&amp; def.joints.length != def.bodies.length) {
    throw new IllegalArgumentException(
        "Incorrect joint definition.  Joints have to correspond to "
        "the bodies");
  }

  if (def.joints == null) {
    final djd = new DistanceJointDef();
    distanceJoints = new List&lt;DistanceJoint&gt;(bodies.length);
    for (int i = 0; i &lt; targetLengths.length; ++i) {
      final int next = (i == targetLengths.length - 1) ? 0 : i + 1;
      djd.frequencyHz = def.frequencyHz;
      djd.dampingRatio = def.dampingRatio;
      djd.initialize(bodies[i], bodies[next], bodies[i].worldCenter,
          bodies[next].worldCenter);
      distanceJoints[i] = _world.createJoint(djd);
    }
  } else {
    distanceJoints = new List&lt;DistanceJoint&gt;(def.joints.length);
    distanceJoints.setRange(0, def.joints.length, def.joints);
  }

  frequencyHz = def.frequencyHz;
  dampingRatio = def.dampingRatio;

  normals = new List&lt;Vector&gt;(bodies.length);
  for (int i = 0; i &lt; normals.length; ++i) {
    normals[i] = new Vector();
  }

  this.bodyA = bodies[0];
  this.bodyB = bodies[1];
  this.collideConnected = false;
}
</pre>
</div>
</div>
<div class="method"><h4 id="constrainEdges">
<button class="show-code">Code</button>
bool <strong>constrainEdges</strong>(<a href="../box2d_console/TimeStep.html">TimeStep</a> argStep) <a class="anchor-link" href="#constrainEdges"
              title="Permalink to ConstantVolumeJoint.constrainEdges">#</a></h4>
<div class="doc">
<p>Apply the position correction to the particles.</p>
<pre class="source">
bool constrainEdges(TimeStep argStep) {
  num perimeter = 0.0;
  for (int i = 0; i &lt; bodies.length; ++i) {
    final int next = (i == bodies.length - 1) ? 0 : i + 1;
    num dx = bodies[next].worldCenter.x - bodies[i].worldCenter.x;
    num dy = bodies[next].worldCenter.y - bodies[i].worldCenter.y;
    num dist = Math.sqrt(dx * dx + dy * dy);
    if (dist &lt; Settings.EPSILON) {
      dist = 1.0;
    }
    normals[i].x = dy / dist;
    normals[i].y = -dx / dist;
    perimeter += dist;
  }

  final delta = new Vector();

  num deltaArea = targetVolume - area;
  num toExtrude = 0.5 * deltaArea / perimeter; // relaxationFactor
  bool done = true;
  for (int i = 0; i &lt; bodies.length; ++i) {
    final int next = (i == bodies.length - 1) ? 0 : i + 1;
    delta.setCoords(toExtrude * (normals[i].x + normals[next].x), toExtrude
        * (normals[i].y + normals[next].y));
    num norm = delta.length;
    if (norm &gt; Settings.MAX_LINEAR_CORRECTION) {
      delta.mulLocal(Settings.MAX_LINEAR_CORRECTION / norm);
    }
    if (norm &gt; Settings.LINEAR_SLOP) {
      done = false;
    }
    bodies[next].sweep.center.x += delta.x;
    bodies[next].sweep.center.y += delta.y;
    bodies[next].synchronizeTransform();
  }

  return done;
}
</pre>
</div>
</div>
<div class="method"><h4 id="destructor">
<button class="show-code">Code</button>
void <strong>destructor</strong>() <a class="anchor-link" href="#destructor"
              title="Permalink to ConstantVolumeJoint.destructor">#</a></h4>
<div class="doc">
<div class="inherited">
<p>Override to handle destruction of joint</p>
<div class="docs-inherited-from">docs inherited from <a href="../box2d_console/Joint.html">Joint</a> </div></div>
<pre class="source">
void destructor() {
  for (int i = 0; i &lt; distanceJoints.length; ++i) {
    _world.destroyJoint(distanceJoints[i]);
  }
}
</pre>
</div>
</div>
<div class="method"><h4 id="getAnchorA">
<button class="show-code">Code</button>
void <strong>getAnchorA</strong>(<a href="../box2d_console/Vector.html">Vector</a> argOut) <a class="anchor-link" href="#getAnchorA"
              title="Permalink to ConstantVolumeJoint.getAnchorA">#</a></h4>
<div class="doc">
<div class="inherited">
<p>Get the anchor point on bodyA in world coordinates.</p>
<div class="docs-inherited-from">docs inherited from <a href="../box2d_console/Joint.html">Joint</a> </div></div>
<pre class="source">
void getAnchorA(Vector argOut) {
  throw new NotImplementedException();
}
</pre>
</div>
</div>
<div class="method"><h4 id="getAnchorB">
<button class="show-code">Code</button>
void <strong>getAnchorB</strong>(<a href="../box2d_console/Vector.html">Vector</a> argOut) <a class="anchor-link" href="#getAnchorB"
              title="Permalink to ConstantVolumeJoint.getAnchorB">#</a></h4>
<div class="doc">
<div class="inherited">
<p>Get the anchor point on bodyB in world coordinates.</p>
<div class="docs-inherited-from">docs inherited from <a href="../box2d_console/Joint.html">Joint</a> </div></div>
<pre class="source">
void getAnchorB(Vector argOut) {
  throw new NotImplementedException();
}
</pre>
</div>
</div>
<div class="method"><h4 id="getReactionForce">
<button class="show-code">Code</button>
void <strong>getReactionForce</strong>(num inv_dt, <a href="../box2d_console/Vector.html">Vector</a> argOut) <a class="anchor-link" href="#getReactionForce"
              title="Permalink to ConstantVolumeJoint.getReactionForce">#</a></h4>
<div class="doc">
<div class="inherited">
<p>Get the reaction force on body2 at the joint anchor in Newtons.</p>
<div class="docs-inherited-from">docs inherited from <a href="../box2d_console/Joint.html">Joint</a> </div></div>
<pre class="source">
void getReactionForce(num inv_dt, Vector argOut) {
  throw new NotImplementedException();
}
</pre>
</div>
</div>
<div class="method"><h4 id="getReactionTorque">
<button class="show-code">Code</button>
num <strong>getReactionTorque</strong>(num inv_dt) <a class="anchor-link" href="#getReactionTorque"
              title="Permalink to ConstantVolumeJoint.getReactionTorque">#</a></h4>
<div class="doc">
<div class="inherited">
<p>Get the reaction torque on body2 in N*m.</p>
<div class="docs-inherited-from">docs inherited from <a href="../box2d_console/Joint.html">Joint</a> </div></div>
<pre class="source">
num getReactionTorque(num inv_dt) {
  throw new NotImplementedException();
}
</pre>
</div>
</div>
<div class="method inherited"><h4 id="hashCode">
<button class="show-code">Code</button>
int <strong>hashCode</strong>() <a class="anchor-link" href="#hashCode"
              title="Permalink to ConstantVolumeJoint.hashCode">#</a></h4>
<div class="inherited-from">inherited from Object </div><div class="doc">
<p>Get a hash code for this object.</p>
<p>All objects have hash codes. Hash codes are guaranteed to be the
same for objects that are equal when compared using the equality
operator <code>==</code>. Other than that there are no guarantees about
the hash codes. They will not be consistent between runs and
there are no distribution guarantees.</p>
<p>If a subclass overrides <code>hashCode</code> it should override the
equality operator as well to maintain consistency.</p>
<pre class="source">
external int hashCode();
</pre>
</div>
</div>
<div class="method"><h4 id="inflate">
<button class="show-code">Code</button>
void <strong>inflate</strong>(num factor) <a class="anchor-link" href="#inflate"
              title="Permalink to ConstantVolumeJoint.inflate">#</a></h4>
<div class="doc">
<pre class="source">
void inflate(num factor) {
  targetVolume *= factor;
}
</pre>
</div>
</div>
<div class="method"><h4 id="initVelocityConstraints">
<button class="show-code">Code</button>
void <strong>initVelocityConstraints</strong>(<a href="../box2d_console/TimeStep.html">TimeStep</a> argStep) <a class="anchor-link" href="#initVelocityConstraints"
              title="Permalink to ConstantVolumeJoint.initVelocityConstraints">#</a></h4>
<div class="doc">
<pre class="source">
void initVelocityConstraints(TimeStep argStep) {
  step = argStep;

  final d = new List&lt;Vector&gt;(bodies.length);
  for (int i = 0; i &lt; bodies.length; i++) {
    d[i] = new Vector();
  }

  for (int i = 0; i &lt; bodies.length; ++i) {
    final int prev = (i == 0) ? bodies.length - 1 : i - 1;
    final int next = (i == bodies.length - 1) ? 0 : i + 1;
    d[i].setFrom(bodies[next].worldCenter);
    d[i].subLocal(bodies[prev].worldCenter);
  }

  if (step.warmStarting) {
    _impulse *= step.dtRatio;
    for (int i = 0; i &lt; bodies.length; ++i) {
      bodies[i].linearVelocity.x += bodies[i].invMass * d[i].y *
          .5 * _impulse;
      bodies[i].linearVelocity.y += bodies[i].invMass * -d[i].x *
          .5 * _impulse;
    }
  } else {
    _impulse = 0.0;
  }
}
</pre>
</div>
</div>
<div class="method inherited"><h4 id="Joint">
<button class="show-code">Code</button>
new <strong>Joint</strong>(<a href="../box2d_console/JointDef.html">JointDef</a> def) <a class="anchor-link" href="#Joint"
              title="Permalink to ConstantVolumeJoint.Joint">#</a></h4>
<div class="inherited-from">inherited from <a href="../box2d_console/Joint.html">Joint</a> </div><div class="doc">
<pre class="source">
Joint(JointDef def) :
  type = def.type,
  _prev = null,
  _next = null,
  bodyA = def.bodyA,
  bodyB = def.bodyB,
  collideConnected = def.collideConnected,
  islandFlag = false,
  userData = def.userData,

  localCenterA = new Vector(),
  localCenterB = new Vector(),
  edgeA = new JointEdge(),
  edgeB = new JointEdge() { }
</pre>
</div>
</div>
<div class="method inherited"><h4 id="Joint.create">
<button class="show-code">Code</button>
factory <strong>Joint.create</strong>(<a href="../box2d_console/World.html">World</a> argWorld, <a href="../box2d_console/JointDef.html">JointDef</a> def) <a class="anchor-link" href="#Joint.create"
              title="Permalink to ConstantVolumeJoint.Joint.create">#</a></h4>
<div class="inherited-from">inherited from <a href="../box2d_console/Joint.html">Joint</a> </div><div class="doc">
<pre class="source">
factory Joint.create(World argWorld, JointDef def) {
  switch(def.type){
    case JointType.MOUSE:
      throw new NotImplementedException();
      //  return new MouseJoint(def);
    case JointType.DISTANCE:
      return new DistanceJoint(def);
    case JointType.PRISMATIC:
      throw new NotImplementedException();
      //  return new PrismaticJoint(def);
    case JointType.REVOLUTE:
      return new RevoluteJoint(def);
    case JointType.WELD:
      throw new NotImplementedException();
      //return new WeldJoint(def);
    case JointType.FRICTION:
      return new FrictionJoint(def);
    case JointType.LINE:
      throw new NotImplementedException();
      //return new LineJoint(def);
    case JointType.GEAR:
      throw new NotImplementedException();
      //return new GearJoint(def);
    case JointType.PULLEY:
      throw new NotImplementedException();
      //return new PulleyJoint(def);
    case JointType.CONSTANT_VOLUME:
      return new ConstantVolumeJoint(argWorld, def);
  }
  return null;
}
</pre>
</div>
</div>
<div class="method inherited"><h4 id="noSuchMethod">
<button class="show-code">Code</button>
<strong>noSuchMethod</strong>(String name, List args) <a class="anchor-link" href="#noSuchMethod"
              title="Permalink to ConstantVolumeJoint.noSuchMethod">#</a></h4>
<div class="inherited-from">inherited from Object </div><div class="doc">
<p><code>noSuchMethod</code> is invoked when users invoke a non-existant method
on an object. The name of the method and the arguments of the
invocation are passed to <code>noSuchMethod</code>. If <code>noSuchMethod</code>
returns a value, that value becomes the result of the original
invocation.</p>
<p>The default behavior of <code>noSuchMethod</code> is to throw a
<code>noSuchMethodError</code>.</p>
<pre class="source">
external Dynamic noSuchMethod(String name, List args);
</pre>
</div>
</div>
<div class="method inherited"><h4 id="Object">
<button class="show-code">Code</button>
const <strong>Object</strong>() <a class="anchor-link" href="#Object"
              title="Permalink to ConstantVolumeJoint.Object">#</a></h4>
<div class="inherited-from">inherited from Object </div><div class="doc">
<p>Creates a new <code>Object</code> instance.</p>
<p><code>Object</code> instances have no meaningful state, and are only useful
through their identity. An <code>Object</code> instance is equal to itself
only.</p>
<pre class="source">
const Object();
</pre>
</div>
</div>
<div class="method"><h4 id="solvePositionConstraints">
<button class="show-code">Code</button>
bool <strong>solvePositionConstraints</strong>(num baumgarte) <a class="anchor-link" href="#solvePositionConstraints"
              title="Permalink to ConstantVolumeJoint.solvePositionConstraints">#</a></h4>
<div class="doc">
<p>Solves for the impact of this joint on the positions of the connected
bodies. Implements abstract method in <a class="crossref" href="../box2d_console/Joint.html">Joint</a>.</p>
<pre class="source">
bool solvePositionConstraints(num baumgarte) {
  return constrainEdges(step);
}
</pre>
</div>
</div>
<div class="method"><h4 id="solveVelocityConstraints">
<button class="show-code">Code</button>
void <strong>solveVelocityConstraints</strong>(<a href="../box2d_console/TimeStep.html">TimeStep</a> argStep) <a class="anchor-link" href="#solveVelocityConstraints"
              title="Permalink to ConstantVolumeJoint.solveVelocityConstraints">#</a></h4>
<div class="doc">
<p>Solves for the impact of this joint on the velocities of the connected
bodies. Implements abstract method in <a class="crossref" href="../box2d_console/Joint.html">Joint</a>.</p>
<pre class="source">
void solveVelocityConstraints(TimeStep argStep) {
  num crossMassSum = 0.0;
  num dotMassSum = 0.0;

  final d = new List&lt;Vector&gt;(bodies.length);
  for (int i = 0; i &lt; bodies.length; i++) {
    d[i] = new Vector();
  }

  for (int i = 0; i &lt; bodies.length; ++i) {
    final int prev = (i == 0) ? bodies.length - 1 : i - 1;
    final int next = (i == bodies.length - 1) ? 0 : i + 1;
    d[i].setFrom(bodies[next].worldCenter);
    d[i].subLocal(bodies[prev].worldCenter);
    dotMassSum += (d[i].lengthSquared) / bodies[i].mass;
    crossMassSum += Vector.crossVectors(bodies[i].linearVelocity, d[i]);
  }
  num lambda = -2.0 * crossMassSum / dotMassSum;
  _impulse += lambda;
  for (int i = 0; i &lt; bodies.length; ++i) {
    bodies[i].linearVelocity.x += bodies[i].invMass * d[i].y * .5 * lambda;
    bodies[i].linearVelocity.y += bodies[i].invMass * -d[i].x * .5 * lambda;
  }
}
</pre>
</div>
</div>
<div class="method inherited"><h4 id="toString">
<button class="show-code">Code</button>
String <strong>toString</strong>() <a class="anchor-link" href="#toString"
              title="Permalink to ConstantVolumeJoint.toString">#</a></h4>
<div class="inherited-from">inherited from Object </div><div class="doc">
<p>Returns a string representation of this object.</p>
<pre class="source">
external String toString();
</pre>
</div>
</div>
</div>
        </div>
        <div class="clear"></div>
        </div>
        
        <div class="footer">
          
        </div>
        <script async src="../client-live-nav.js"></script>
        </body></html>
        
